let ports = {};
const timeout = 4000;
const bathUrl = 'http://localhost:9876';
let funcMap = {};
let recordName = localStorage.getItem("record-name");
recordName = recordName ? recordName : 'undefined';

// 监听长连接
chrome.runtime.onConnect.addListener(function (port) {
    ports[port.sender.tab.id] = port;
    if (port.name == 'record-connect') {
        port.onMessage.addListener((msg) => handlerMsg(port.sender.tab.id, msg));
    }
});
chrome.tabs.onRemoved.addListener((id) => {
    delete ports[id];
});

//执行tab方法
function invoke(tabId, method, data, func) {
    let fid = guid();
    funcMap[fid] = func;
    ports[tabId].postMessage({type: 'eval', fid: fid, method: method, data: data});
    setTimeout(() => {
        delete funcMap[fid];
    }, timeout);
}

//执行tab回调
function invokeCallback(msg) {
    if (msg.fid) {
        let func = funcMap[msg.fid];
        if (func) {
            func(msg.data);
        }
    }
}

//供tab调用
function eval(tabId, msg) {
    if (msg.method && window[msg.method]) {
        let ret = window[msg.method](msg.data);
        if (ret.then) {
            ret.then(retData => {
                ports[tabId].postMessage({type: 'callback', fid: msg.fid, data: retData});
            });
        } else {
            ports[tabId].postMessage({type: 'callback', fid: msg.fid, data: ret});
        }
    }
}


//处理msg
function handlerMsg(tabId, msg) {
    if (msg.type == 'callback') {
        invokeCallback(msg);
    } else if (msg.type == 'eval') {
        eval(tabId, msg);
    }
}
